package structureModel.combination;

import structureModel.combination.file.ImagerFile;
import structureModel.combination.file.TextFile;
import structureModel.combination.file.VideoFile;

/**
 * 组合模式
 */
public class Client {

    /**
     *  模式总结

     1、 组合模式用于将多个对象组合成树形结构以表示“整体-部分”的结构层次。
     组合模式对单个对象（叶子对象）和组合对象（容器对象）的使用具有一致性。

     2、 组合对象的关键在于它定义了一个抽象构建类，
     它既可表示叶子对象，也可表示容器对象，
     客户仅仅需要针对这个抽象构建进行编程，
     无须知道他是叶子对象还是容器对象，都是一致对待。

     3、 组合模式虽然能够非常好地处理层次结构，
     也使得客户端程序变得简单，但是它也使得设计变得更加抽象，
     而且也很难对容器中的构件类型进行限制，这会导致在增加新的构件时会产生一些问题。

     模式适用场景

     1、需要表示一个对象整体或部分层次，在具有整体和部分的层次结构中，
     希望通过一种方式忽略整体与部分的差异，可以一致地对待它们。

     2、让客户能够忽略不同对象层次的变化，客户端可以针对抽象构件编程，无须关心对象层次结构的细节。


     * @param args
     */
    public static void main(String[] args) {
        /**
         * 我们先建立一个这样的文件系统
         *                  总文件
         *                  
         *   a.txt    b.jpg                   c文件夹              
         *                      c_1.text  c_1.rmvb    c_1.jpg   
         *                                                       
         */ 
        //总文件夹
        Folder zwjj = new Folder("总文件夹");
        //向总文件夹中放入三个文件：1.txt、2.jpg、1文件夹
        TextFile aText= new TextFile("a.txt");
        ImagerFile bImager = new ImagerFile("b.jpg");
        Folder cFolder = new Folder("C文件夹");
        
        zwjj.add(aText);
        zwjj.add(bImager);
        zwjj.add(cFolder);
        
        //向C文件夹中添加文件：c_1.txt、c_1.rmvb、c_1.jpg 
        TextFile cText = new TextFile("c_1.txt");
        ImagerFile cImage = new ImagerFile("c_1.jpg");
        VideoFile cVideo = new VideoFile("c_1.rmvb");
        
        cFolder.add(cText);
        cFolder.add(cImage);
        cFolder.add(cVideo);
        
        //遍历C文件夹
        cFolder.display();
        //将c_1.txt删除
        cFolder.remove(cText);
        System.out.println("-----------------------");
        cFolder.display();

        System.out.println("zwjj-----------------------");
        zwjj.display();
    }
}